package it.polimi.meteocal_pappalardo_sacchi.bean;

import it.polimi.meteocal_pappalardo_sacchi.entity.Calendar;
import it.polimi.meteocal_pappalardo_sacchi.entity.Event;
import it.polimi.meteocal_pappalardo_sacchi.entity.MeteoCalUser;
import it.polimi.meteocal_pappalardo_sacchi.entity.WeatherForecast;

import javax.annotation.PostConstruct;
import javax.faces.view.ViewScoped;
import javax.inject.Named;
import java.io.Serializable;
import java.util.ArrayList;

/**
 * Created by Alessandro on 15/01/15.
 */
@Named
@ViewScoped
public class CreateEventBean extends EventBean implements Serializable {

    @PostConstruct
    private void createEventInit() {
        setEvent(new Event());
    }

    public String create() {

        //controllo correttezza campi
        if (!checkAll()) {
            return null;
        }

        //setto il creatore dell'evento
        getEvent().setCreator(userBean.getUser());
        userBean.getUser().getCreatedEventList().add(getEvent());

        //aggiungo il creatore alla lista degli invitati dell'evento
        addInvitedUserCalendarToInvitedList(userBean.getUser().getOwnedCalendar());

        //setto la lista dei (calendari) partecipanti
        getEvent().setParticipantCalendarList(getInvitedUserCalendarList());

        /*If available, I download forecasts immediately*/
        if (getEvent().isOutdoor()) {
            forecastBean.retrieveForecastForEvent(getEvent());
        }

        //è importante che il create stia prima dell'eventuale invio delle notifiche di cattivo tempo, altrimenti non riesco a prendere l'elenco degli invitati dal db
        eventManager.create(getEvent());

        //invio inviti, dopo la creazione evento o ci sono problemi di cascade
        notificationManager.sendInvitationToUserList(getEvent(), getInvitedUserListToNotify());

        /*
        If the event starts before the scheduler can run the method to produce
        bad weather notification and suggestion, I do it immediately
        */        
        if (getEvent().isOutdoor() && eventManager.isEventStartingTodayOrTomorrow(getEvent())) {
            for(WeatherForecast w : getEvent().getWeatherForecastList()) {
                if(weatherManager.checkBadCondition(getEvent().getWeatherCondition(), w.getWeatherCondition())) {
                    notificationManager.sendBadWeatherNotification(getEvent());
                    break;
                }
            }
           //da valutare se tenere o no:         
           //notificationManager.sendBadWeatherNotificationWithSuggestion(getEvent());
        }


        return "/user/calendar?faces-redirect=true";
    }
}
